<?php

/*
 * Para resolver las inyecciones lleva un mapa del tipo
 * [Clase] => [ClasePosta, EstrategiaDeInstanciacion] 
 * (Como estrategia aplican tanto Normal como Singleton. 
 *  No esta preparado para usar una estrategia de inyección)
 * 
 * La configuración esperada en el .ini es:
 * 
 	[dependencies]
 	  	ClaseDependencia.InstanceStrategy = "Inyection"
		ClaseDependencia.InyectionType ="Normal"
		ClaseDependencia.InyectedClass = "ClaseDependencia_Posta"
			
		OtraClaseDependencia.InstanceStrategy = "Inyection"
		OtraClaseDependencia.InyectionType = "Singleton"
		OtraClaseDependencia.InyectedClass = "ClaseMock"
 * */

class Exts_Dependency_Instantiator_Inyector extends Exts_Dependency_Instantiator_Abstract {
	
	protected static $_instance;
	protected $_classMap;
	
	private function __construct() {}
	
	public static function InstantiatorInstance () {
		if (empty(self::$_instance)) {
			self::$_instance = new Exts_Dependency_Instantiator_Inyector();
		}
		
		return self::$_instance;
	}
	
	
	public function addMapping ($classInvoked, $classToInstantiate, $strategy){
		$this->_classMap[$classInvoked] = array ("ClassToInstantiate" => $classToInstantiate, "Strategy" => $strategy);
	}
	
	public function _makeAnInstance($className) {
		if (array_key_exists($className, $this->_classMap)){
			$realClass = $this->_classMap[$className]["ClassToInstantiate"];
			$strategy = $this->_classMap[$className]["Strategy"];
			return $strategy->instance($realClass);
		}
		throw new Exts_Exception ("Se intento inyectar una dependencia no mapeada! << $className >>");
	}
	
}

